package cn.edu.ncut.cs.springboot.petmanagementsystem.Util;

import cn.edu.ncut.cs.springboot.petmanagementsystem.mapper.UserMapper;
import cn.edu.ncut.cs.springboot.petmanagementsystem.pojo.User;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 密码批量更新工具类
 * 用于将所有用户的密码重置为加密后的 "123456"
 * 
 * 使用方法：
 * 1. 取消 @Component 注解的注释，重启应用，会自动执行
 * 2. 执行完成后，重新注释 @Component 注解，防止重复执行
 */
@Slf4j
// @Component  // 需要执行时取消此行注释
public class PasswordUpdateUtil implements CommandLineRunner {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private PasswordEncoder passwordEncoder;

    private static final String DEFAULT_PASSWORD = "123456";

    @Override
    public void run(String... args) throws Exception {
        log.info("========================================");
        log.info("开始批量更新用户密码...");
        log.info("========================================");

        try {
            // 查询所有用户
            LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
            List<User> users = userMapper.selectList(wrapper);

            if (users == null || users.isEmpty()) {
                log.warn("没有找到任何用户，无需更新");
                return;
            }

            log.info("找到 {} 个用户，开始更新密码...", users.size());

            // 生成加密后的密码
            String encodedPassword = passwordEncoder.encode(DEFAULT_PASSWORD);
            log.info("BCrypt 加密后的密码: {}", encodedPassword);

            int successCount = 0;
            int failCount = 0;

            // 批量更新每个用户的密码
            for (User user : users) {
                try {
                    user.setPassword(encodedPassword);
                    user.setUpdateTime(LocalDateTime.now());
                    int result = userMapper.updateById(user);
                    
                    if (result > 0) {
                        successCount++;
                        log.info("成功更新用户: {} (ID: {})", user.getUsername(), user.getId());
                    } else {
                        failCount++;
                        log.error("更新用户失败: {} (ID: {})", user.getUsername(), user.getId());
                    }
                } catch (Exception e) {
                    failCount++;
                    log.error("更新用户异常: {} (ID: {}), 错误: {}", 
                            user.getUsername(), user.getId(), e.getMessage());
                }
            }

            log.info("========================================");
            log.info("密码更新完成！");
            log.info("成功: {} 个用户", successCount);
            log.info("失败: {} 个用户", failCount);
            log.info("所有用户的新密码为: {}", DEFAULT_PASSWORD);
            log.info("========================================");
            log.info("请注释掉 PasswordUpdateUtil 类上的 @Component 注解，防止下次启动时重复执行");
            log.info("========================================");

        } catch (Exception e) {
            log.error("批量更新密码时发生错误", e);
            throw e;
        }
    }

    /**
     * 手动调用此方法来执行密码更新
     * 可以在需要的时候通过 Controller 或其他方式调用
     */
    public void updateAllPasswords() {
        try {
            run();
        } catch (Exception e) {
            log.error("手动更新密码失败", e);
        }
    }
}
